# @Time : 2020/7/22 11:29
# @Author : Fioman 
# @Phone : 13149920693
"""
在使用函数cv.threshold()进行阈值处理的时候,需要自定义一个阈值,并以此阈值作为图像阈值处理的依据.
通常情况下处理的图像都是色彩均衡的,这时直接将阈值设定为127是比较合适的.
但是,有时候图像灰度级的分布是不均衡的,如果此时还将阈值设置为127,那么阈值处理结果就是失败的.
在实际处理图像的过程往往是很复杂的,不太可能像上述img那样,一眼就观察错最合适的阈值.如果一个一个的去尝试,工作量很大.

Otsu方法能够根据当前图像给出最佳的类间分割阈值.简而言之,Otsu方法会遍历所有可能的阈值,从而找到最佳的阈值.
在Opencv中,通过函数cv.threshold()中对参数type的类型多传递一个参数."cv.THRES_OTSU",即可实现Otsu方式的阈值分割.

需要说明的是,在使用OTSU方法时,要把阈值设置为0.此时的函数cv.threshold()会自动寻找最优阈值,并将该阈值返回.
T,thresOtsu = cv.threshold(img,0,255,cv.THRES_BINARY|cv.THRES_OTSU)
如果使用的是普通的阈值分割,返回的阈值就是设定的阈值T,如果采用的是大律法,则返回的阈值是不确定的.
"""
import cv2 as cv
import numpy as np

img = np.zeros((5, 5), dtype=np.uint8)
img[:6, :6] = 123
img[2:6, 2:6] = 127

T1, thres = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
T2, thresOtsu = cv.threshold(img, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)

print("T1 = {}, T2 = {}".format(T1, T2))
print("thres = \n {} \n thresOtsu = \n {}".format(thres, thresOtsu))

img = cv.imread("test.bmp", cv.IMREAD_GRAYSCALE)
img = cv.resize(img, (img.shape[1] // 5, img.shape[0] // 5))
T1,thres = cv.threshold(img,np.mean(img),255,cv.THRESH_BINARY)
T2,thresOtsu = cv.threshold(img,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)

print("T1 = {}, T2 = {}".format(T1,T2))
cv.imshow("thres",thres)
cv.imshow("thresOtsu",thresOtsu)
cv.waitKey(0)









